#!/bin/bash

# 单 master 的 rdd 计算集群搭建：
# 1. 前提为 master, worker 各节点已经安装 postgresql v13
# 2. 已经编辑好 node_list.csv

# 1. 登录 master 节点所在 linux 主机，执行本 install.sh；
cd $(dirname $0)

# 2. 在 master 上，执行脚本 01_master_create.sql, 在 master 节点上创建结构；
psql -U postgres -f ./on_master/01_master_create.sql

# 3. 将 master, work 节点的 postgres 认证信息配置在 master 节点的 sm_rdd.tb_snap_cluster_node_list 表内；
psql -U postgres -c "copy sm_rdd.tb_snap_cluster_node_list(node_ipv4, node_port, fdw_username, fdw_password, node_status, is_master, is_worker) from 'node_list.csv' header csv"

psql_conn_master="psql -U postgres -c"
select_node_sql_worker="select node_id, node_ipv4, node_port, fdw_username, fdw_password, node_status from sm_rdd.tb_snap_cluster_node_list where is_worker is true and node_status = '1'"
select_node_sql_master="select node_id, node_ipv4, node_port, fdw_username, fdw_password, node_status from sm_rdd.tb_snap_cluster_node_list where is_master is true and node_status = '1' limit 1"
node_list_worker=$($psql_conn_master "${select_node_sql_worker}")
node_list_master=$($psql_conn_master "${select_node_sql_master}")

node_id_master=`echo ${node_list_master[0]} | perl -F"," -alne '{print @F[0] if $.==1}'`;node_id=`echo $node_id | awk '{printf("%12d\n",$0)}'`
node_ipv4_master=`echo ${node_list_master[0]} | perl -F"," -alne '{print @F[1] if $.==1}'`
node_port_master=`echo ${node_list_master[0]} | perl -F"," -alne '{print @F[2] if $.==1}'`
fdw_username_master=`echo ${node_list_master[0]} | perl -F"," -alne '{print @F[3] if $.==1}'`
fdw_password_master=`echo ${node_list_master[0]} | perl -F"," -alne '{print @F[4] if $.==1}'`

#   3.1. 执行检查脚本 ???.sql，检查各节点端口开放，互联通畅;


# 4. 在 worker 上，执行脚本 03_work_create.sql, 在各个 worker 节点创建结构与初始化配置；
line_no=1
for node_record in $node_list_worker
do
  if [ $line_no -gt 1 ]
  then
    node_id=`echo $node_record | perl -F"," -alne '{print @F[0] if $.==1}'`;node_id=`echo $node_id | awk '{printf("%12d\n",$0)}'`
    node_ipv4=`echo $node_record | perl -F"," -alne '{print @F[1] if $.==1}'`
    node_port=`echo $node_record | perl -F"," -alne '{print @F[2] if $.==1}'`
    fdw_username=`echo $node_record | perl -F"," -alne '{print @F[3] if $.==1}'`
    fdw_password=`echo $node_record | perl -F"," -alne '{print @F[4] if $.==1}'`
    
    cat ./on_master/03_worker_create.sql \
      | perl -lne '{/s/\$\{node_id\}/'$node_id'/ge;print $_}' \
      | xargs psql -h "$node_ipv4" -U "$fdw_username" -p "$node_port" -W"$fdw_password" -c 
    
    let line_no=$line_no+1
  fi
done

# 5. 在 master 上，执行 04_master_fdw_create.sql，创建 fdw worker 结构
line_no=1
for node_record in $node_list_worker
do
  if [ $line_no -gt 1 ]
  then
    node_id=`echo $node_record | perl -F"," -alne '{print @F[0] if $.==1}'`;node_id=`echo $node_id | awk '{printf("%12d\n",$0)}'`
    node_ipv4=`echo $node_record | perl -F"," -alne '{print @F[1] if $.==1}'`
    node_port=`echo $node_record | perl -F"," -alne '{print @F[2] if $.==1}'`
    fdw_username=`echo $node_record | perl -F"," -alne '{print @F[3] if $.==1}'`
    fdw_password=`echo $node_record | perl -F"," -alne '{print @F[4] if $.==1}'`
    
    cat ./on_master/04_master_fdw_create.sql \
      | perl -lne '{/s/\$\{node_id\}/'$node_id'/ge;print $_}' \
      | perl -lne '{/s/\$\{node_ipv4\}/'$node_ipv4'/ge;print $_}' \
      | perl -lne '{/s/\$\{node_port\}/'$node_port'/ge;print $_}' \
      | perl -lne '{/s/\$\{fdw_username\}/'$fdw_username'/ge;print $_}' \
      | perl -lne '{/s/\$\{fdw_password\}/'$fdw_password'/ge;print $_}' \
      | xargs psql -h "$node_ipv4_master" -U "$fdw_username_master" -p "$node_port_master" -W"$fdw_password_master" -c 
      
    let line_no=$line_no+1
  fi
done

# 6. 在 worker 上，执行 05_worker_config.sql, 06_worker_fdw_create.sql，配参、创建 fdw master 结构
line_no=1
for node_record in $node_list_worker
do
  if [ $line_no -gt 1 ]
  then
    node_id=`echo $node_record | perl -F"," -alne '{print @F[0] if $.==1}'`;node_id=`echo $node_id | awk '{printf("%12d\n",$0)}'`
    node_ipv4=`echo $node_record | perl -F"," -alne '{print @F[1] if $.==1}'`
    node_port=`echo $node_record | perl -F"," -alne '{print @F[2] if $.==1}'`
    fdw_username=`echo $node_record | perl -F"," -alne '{print @F[3] if $.==1}'`
    fdw_password=`echo $node_record | perl -F"," -alne '{print @F[4] if $.==1}'`
    
    cat ./on_worker/05_worker_config.sql \
      | perl -lne '{/s/\$\{node_ipv4_master\}/'$node_ipv4_master'/ge;print $_}'  \
      | perl -lne '{/s/\$\{node_port_master\}/'$node_port_master'/ge;print $_}'  \
      | perl -lne '{/s/\$\{fdw_username_master\}/'$fdw_username_master'/ge;print $_}'  \
      | perl -lne '{/s/\$\{fdw_password_master\}/'$fdw_password_master'/ge;print $_}'  \
      | xargs psql -h "$node_ipv4" -U "$fdw_username" -p "$node_port" -W"$fdw_password" -c
      
    cat ./on_worker/06_worker_fdw_create.sql \
      | perl -lne '{/s/\$\{node_id_master\}/'$node_id_master'/ge;print $_}'  \
      | perl -lne '{/s/\$\{node_ipv4_master\}/'$node_ipv4_master'/ge;print $_}'  \
      | perl -lne '{/s/\$\{node_port_master\}/'$node_port_master'/ge;print $_}'  \
      | perl -lne '{/s/\$\{fdw_username_master\}/'$fdw_username_master'/ge;print $_}'  \
      | perl -lne '{/s/\$\{fdw_password_master\}/'$fdw_password_master'/ge;print $_}'  \
      | xargs psql -h "$node_ipv4" -U "$fdw_username" -p "$node_port" -W"$fdw_password" -c
    
    let line_no=$line_no+1
  fi
done

# 5. 创建函数和存储过程；
#   5.1. 创建 master 上的函数和存储过程；
psql -h "$node_ipv4_master" -U "$fdw_username_master" -p "$node_port_master" -W"$fdw_password_master" -f ./on_master/07_fn_prc_create/*.sql

#   5.2. 创建 worker 上的函数和存储过程；
line_no=1
for node_record in $node_list_worker
do
  if [ $line_no -gt 1 ]
  then
    node_id=`echo $node_record | perl -F"," -alne '{print @F[0] if $.==1}'`;node_id=`echo $node_id | awk '{printf("%12d\n",$0)}'`
    node_ipv4=`echo $node_record | perl -F"," -alne '{print @F[1] if $.==1}'`
    node_port=`echo $node_record | perl -F"," -alne '{print @F[2] if $.==1}'`
    fdw_username=`echo $node_record | perl -F"," -alne '{print @F[3] if $.==1}'`
    fdw_password=`echo $node_record | perl -F"," -alne '{print @F[4] if $.==1}'`
    
    psql -h "$node_ipv4" -U "$fdw_username" -p "$node_port" -W"$fdw_password" -f ./on_worker/08_fn__prc_create/*.sql
      
    let line_no=$line_no+1
  fi
done


# 7. rdd 任务执行
#   7.1. 在 master postgres 下，调用 sm_rdd.fv_rdd_map_input 执行 rdd 任务
#   7.2. 调用 sm_rdd.ft_rdd_map_output 返回结果；